#include <iostream>
#include <stdlib.h>
#include "Coordenada.h"
#include "DibujoSVG.h"
#include <fstream>
#include <string.h>
#include "ExcepcionSVG.h"
using namespace std;

/** \file Coordenada.cc
* \brief Modulos principales
*
* Modulos importantes que se usan en el programa.
* JAVIER ANTON DIAZ DNI:48629698Q
* STANISLAV LITVINENKO DNI:02062226T
*/



Coordenada::Coordenada( float x, float y)
{
	if(x<=DibujoSVG::MAX_VALOR && x >=DibujoSVG::MIN_VALOR && y<=DibujoSVG::MAX_VALOR && y>=DibujoSVG::MIN_VALOR)
	{
		this->x = x;
		this->y = y;
	}
	else
	{
		throw ExcepcionCoordenadaErronea( x, y );
	}
}

Coordenada::Coordenada(const Coordenada &coor)
{
	x = coor.x;
	y = coor.y;
}

Coordenada::~Coordenada()
{
	x = y = 0;
}

Coordenada&
Coordenada::operator =(const Coordenada  &coor )
{
	if( this != &coor )
	{
		x = coor.x;
		y = coor.y;
	}
	return *this;
}

float
Coordenada::getX( ) const
{
	return x;	
}

float
Coordenada::getY( ) const
{
	return y;
}

void
Coordenada::imprimir( ostream &os ) const
{
		os << this->x << "," << this->y;
}


bool
Coordenada::operator==( const Coordenada &c ) const
{
	bool flag = false;

	if ( x == c.x && y == c.y)
	{
		flag = true;
	}
	return flag;
}

Coordenada
Coordenada::operator+(const Coordenada &c) const
{
	Coordenada ret;

	//try
	//{
		if(x + c.x > DibujoSVG::MAX_VALOR || x + c.x < DibujoSVG::MIN_VALOR || y + c.y > DibujoSVG::MAX_VALOR || y + c.y < DibujoSVG::MIN_VALOR)
		{
			throw ExcepcionCoordenadaErronea( ret.x, ret.y);
		}
		else
		{
			ret.x = x + c.x;
			ret.y = y + c.y;			
		}
	//}

	//catch( ExcepcionCoordenadaErronea &c)
	//{
	//	c.what();
	//}

	return ret;
}

Coordenada
Coordenada::operator -(const Coordenada &c) const
{
	Coordenada ret;

	//try
	//{
		ret.x = x - c.x;
		ret.y = y - c.y;

		if(ret.x > DibujoSVG::MAX_VALOR || ret.x < DibujoSVG::MIN_VALOR || ret.y > DibujoSVG::MAX_VALOR || ret.y < DibujoSVG::MIN_VALOR)
		{
			throw ExcepcionCoordenadaErronea( ret.x, ret.y);
		}
	//}

	/*catch( ExcepcionCoordenadaErronea &c)
	{
		c.what();
	}*/

	return ret;
}

ostream&
operator<<(ostream &os, const Coordenada &c)
{
	os << c.getX() << "," << c.getY();

	return os;
}

istream&
operator>>( istream &is, Coordenada &c)
{
	string saux = "";
	string xaux = "";
	string yaux = "";
	float coorx=0,coory=0;

	is>>coorx;
	is>>coory;

	if(coorx>DibujoSVG::MAX_VALOR || coorx<DibujoSVG::MIN_VALOR || coory>DibujoSVG::MAX_VALOR || coory<DibujoSVG::MIN_VALOR)
	{
		throw ExcepcionCoordenadaErronea(coorx,coory);
	}
	else
	{
		c.x = coorx;
		c.y = coory;
	}

	return is;
}


Coordenada
Coordenada::operator *(float factor) const
{
	Coordenada ret;

	try
	{
		ret.x = x * factor;
		ret.y = y * factor;

		if(ret.x > DibujoSVG::MAX_VALOR || ret.x < DibujoSVG::MIN_VALOR || ret.y > DibujoSVG::MAX_VALOR || ret.y < DibujoSVG::MIN_VALOR)
		{
			throw ExcepcionCoordenadaErronea( ret.x, ret.y);
		}
	}

	catch( ExcepcionCoordenadaErronea &c)
	{
		c.what();
	}


	return ret;
}
